use serde::Serialize;
use std::env;
use std::sync::Once;

/// 将 &str 转为定长 [u8; N]，超出部分截断，未满补 0。
pub fn to_fixed_str<const N: usize>(s: &str) -> [u8; N] {
    let mut buf = [0u8; N];
    let bytes = s.as_bytes();
    let len = bytes.len().min(N);
    buf[..len].copy_from_slice(&bytes[..len]);
    buf
}

/// 将结构体序列化为 URL query string（推荐用于 REST 请求）
pub fn to_query_string<T: Serialize>(payload: &T) -> String {
    serde_urlencoded::to_string(payload).expect("failed to serialize query string")
}

/// 管理代理设置（适配 Rust 2024 unsafe set_var）
static INIT_PROXY: Once = Once::new();

pub struct ProxyEnv;

impl ProxyEnv {
    /// 初始化代理环境变量，仅生效一次
    pub fn init_once(proxy: &str) {
        INIT_PROXY.call_once(|| {
            println!("[proxy] 设置代理环境变量: {}", proxy);
            unsafe {
                env::set_var("http_proxy", proxy);
                env::set_var("https_proxy", proxy);
                env::set_var("ALL_PROXY", proxy);
            }
        });
    }

    /// 打印当前代理状态（可选调试用）
    pub fn print_current() {
        for var in ["http_proxy", "https_proxy", "ALL_PROXY"] {
            match env::var(var) {
                Ok(val) => println!("{var} = {val}"),
                Err(_) => println!("{var} 未设置"),
            }
        }
    }
}
